﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.UI.FileTransfer.Client;
using Sinacor.Infra.Common;
using PSE.ProcessManager.Common.Process;
using Sinacor.Infra.UI.Common;
using PSE.ProcessManager.Client.Process;

namespace Sinacor.UI.Bovespa.ImportacaoExportacao.Presenter
{
    public class ImportacaoDistribuicao : ImportacaoExportacaoBase<IImportacaoNegocio, Model.Parameter.FiltroImportacaoDistribuicao>, IDisposable, IImportacaoExportacaoPresenter
    {
         #region Atributos

        private Communication.ProcessoImportacaoDistribuicao _communicationProcessoImportacaoDistribuicao = null;
        private Communication.ProcessoImportacaoDistribuicaoProcessamento _communicationProcessoImportacaoDistribuicaoProcessamento = null;

        #endregion

        #region Construtores

        public ImportacaoDistribuicao(IImportacaoNegocio view)
            : this(view, null)
        {
        }

        public ImportacaoDistribuicao(IImportacaoNegocio view, Model.Parameter.IFiltroImportacaoExportacao filtro)
            : base(view, filtro)
        {
            _communicationProcessoImportacaoDistribuicao = new Communication.ProcessoImportacaoDistribuicao(this.Session);
            _communicationProcessoImportacaoDistribuicao.Aborted += new EventHandler(_communication_Aborted);
            _communicationProcessoImportacaoDistribuicao.CommunicationError += new EventHandler<CommunicationErrorEventArgs>(_communication_CommunicationError);
            _communicationProcessoImportacaoDistribuicao.ProcessStatusReceived += new EventHandler<ProcessStatusEventArgs>(_communication_ProcessStatusReceived);
            _communicationProcessoImportacaoDistribuicao.ImportacaoConcluida += new EventHandler<ProcessEventArgs<Model.Parameter.FiltroRetornoImportacaoDistribuicao>>(_communicationProcessoImportacaoDistribuicao_ImportacaoConcluida);
            _communicationProcessoImportacaoDistribuicao.ImportacaoIniciada += new Action(_communicationProcessoImportacaoDistribuicao_ImportacaoIniciada);

            _communicationProcessoImportacaoDistribuicaoProcessamento = new Communication.ProcessoImportacaoDistribuicaoProcessamento(this.Session);
            _communicationProcessoImportacaoDistribuicaoProcessamento.Aborted += new EventHandler(_communication_Aborted);
            _communicationProcessoImportacaoDistribuicaoProcessamento.CommunicationError += new EventHandler<CommunicationErrorEventArgs>(_communication_CommunicationError);
            _communicationProcessoImportacaoDistribuicaoProcessamento.ProcessStatusReceived += new EventHandler<ProcessStatusEventArgs>(_communication_ProcessStatusReceived);
            _communicationProcessoImportacaoDistribuicaoProcessamento = new Communication.ProcessoImportacaoDistribuicaoProcessamento(this.Session);
            _communicationProcessoImportacaoDistribuicaoProcessamento.ProcessamentoConcluido += new Action(_communicationProcessoImportacaoDistribuicaoProcessamento_ProcessamentoConcluido);
        }

        #endregion

        #region Event Handlers

        private void _communication_Aborted(object sender, EventArgs e)
        {
            try
            {
                StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Message.ImportacaoCancelada";
                StatusProcesso.Progress = 0;
                StatusProcesso.FinalizedAt = default(DateTime);

                View.AtualizarStatus();

                View.InformarImportacaoCancelada();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        /// 
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _communication_CommunicationError(object sender, CommunicationErrorEventArgs e)
        {
            try
            {
                StatusProcesso.Progress = 0;
                StatusProcesso.FinalizedAt = default(DateTime);

                View.AtualizarStatus();

                View.InformarErroImportacao();

                HandleException(e.Exception);
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        private void _communication_ProcessStatusReceived(object sender, PSE.ProcessManager.Client.Process.ProcessStatusEventArgs e)
        {
            StatusProcesso.Step = e.Status.Step;
            StatusProcesso.Progress = e.Status.Progress;

            View.AtualizarStatus();
        }

        #region Importação

        private void _communicationProcessoImportacaoDistribuicao_ImportacaoConcluida(object sender, ProcessEventArgs<Model.Parameter.FiltroRetornoImportacaoDistribuicao> e)
        {
            try
            {
                StringBuilder brokers = new StringBuilder();

                foreach (Model.Broker item in e.Parameter.Brokers)
                {
                    brokers.Append(item.CodigoBroker.ToString());
                    brokers.Append(", ");
                }

                if (brokers.Length > 2)
                {
                    brokers.Remove(brokers.Length - 2, 2);
                }
                
                if (View.ConfirmarImportacaoBrokersTORDIST(brokers.ToString()))
                {
                    View.DesabilitarCancelamentoProcesso();
                    _communicationProcessoImportacaoDistribuicaoProcessamento.ProcessarDistribuicao(e.Parameter);
                }
                else
                {
                    StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Label.ImportacaoCancelada";
                    StatusProcesso.Progress = 0;
                    StatusProcesso.FinalizedAt = default(DateTime);

                    View.AtualizarStatus();

                    View.InformarImportacaoCancelada();
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        private void _communicationProcessoImportacaoDistribuicao_ImportacaoIniciada()
        {
            try
            {
                View.HabilitarCancelamentoProcesso();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        #endregion

        #region Processamento Importação

        private void _communicationProcessoImportacaoDistribuicaoProcessamento_ProcessamentoConcluido()
        {
            try
            {
                StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Label.ImportacaoConcluida";
                StatusProcesso.Progress = 100;
                StatusProcesso.FinalizedAt = DateTime.Now;

                View.AtualizarStatus();

                View.InformarImportacaoConcluida();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        #endregion

        #endregion

        #region Métodos Override

        protected override void InicializarTela()
        {
            //Não utilizado na importação
            throw new NotImplementedException();
        }

        protected override void CancelarProcesso()
        {
            try
            {
                _communicationProcessoImportacaoDistribuicao.Abort();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        public override void Executar()
        {
            try
            {
                if (!_communicationProcessoImportacaoDistribuicao.IsProcessRunning()
                    && View.ConfirmarImportacao())
                {

                    StatusProcesso.Progress = 0;
                    StatusProcesso.StartedAt = DateTime.Now;
                    StatusProcesso.FinalizedAt = default(DateTime);

                    StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Label.RealizandoUploadArquivo";
                    View.AtualizarStatus();

                    FileRepository.GetInstance().UploadFile("Bovespa.Distribuicao",
                                                 Filtro.NomeArquivo);

                    StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Label.IniciandoImportacao";
                    StatusProcesso.Progress = 5;

                    View.AtualizarStatus();

                    _communicationProcessoImportacaoDistribuicao.ImportarDistribuicao(base.Filtro);
                }
                else
                {
                    View.FinalizarImportacao(true);
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        #endregion

        #region IDisposable Members

        public override void Dispose()
        {
            _communicationProcessoImportacaoDistribuicao.Disconnect();
            _communicationProcessoImportacaoDistribuicaoProcessamento.Disconnect();

            base.Dispose();
        }

        #endregion

        #region IImportacaoExportacaoPresenter Members

        public new Model.Parameter.IFiltroImportacaoExportacao Filtro
        {
            get
            {
                return base.Filtro;
            }
            set
            {
                base.Filtro = (Model.Parameter.FiltroImportacaoDistribuicao)value;
            }
        }

        public bool IsRunning
        {
            get
            {
                if (this._communicationProcessoImportacaoDistribuicao != null
                    && this._communicationProcessoImportacaoDistribuicaoProcessamento != null)
                {
                    return (this._communicationProcessoImportacaoDistribuicao.IsProcessRunning()
                            || this._communicationProcessoImportacaoDistribuicaoProcessamento.IsProcessRunning());
                }
                else if (this._communicationProcessoImportacaoDistribuicao != null)
                {
                    return this._communicationProcessoImportacaoDistribuicao.IsProcessRunning();
                }
                else if (this._communicationProcessoImportacaoDistribuicaoProcessamento != null)
                {
                    return this._communicationProcessoImportacaoDistribuicaoProcessamento.IsProcessRunning();
                }
                else
                {
                    return false;
                }
            }
        }

        #endregion
    }
}
